// #pragma once
// #include <iostream>
// #include <pthread.h>
// #include <queue>
// #include <vector>
// #include "Log.hpp"
// #include "Cond.hpp"
// #include "Mutex.hpp"
// #include "Thread.hpp"
// using namespace std;
// using namespace my_log;
// using namespace my_cond;
// using namespace my_mutex;
// using namespace my_thread;
// #define NUM 5
// namespace my_threadpool
// {
//     template <typename T>
//     class ThreadPool
//     {
//     private:
//         ThreadPool(const ThreadPool<T>&) = delete;
//         ThreadPool<T>& operator=(const ThreadPool<T>&) = delete;
//         void WakeAllThread();
//         void WakeOnceThread();
//         ThreadPool(int num = NUM);
//         void HandlerTask();
//         ~ThreadPool()
//         {}
//     public:
//         static ThreadPool<T>* GetTreadPool();
//         void Run();

//         void Stop();

//         bool Push(const T &task);

//         void Join();
//     private:
//         int _num;
//         Mutex _lock;
//         Cond _cond;
//         queue<T> _taskq;
//         vector<thread<T>> _threads;
//         int _sleepnum;
//         bool _isrunning;
//         string _name;
//         static ThreadPool<T>* _pthreadpool;
//         static Mutex _lock2;
//     };
//     template<typename T>
//     ThreadPool<T>* ThreadPool<T>::_pthreadpool = nullptr;
//     template<typename T>
//     Mutex ThreadPool<T>::_lock2;
// }


#pragma once
#include <iostream>
#include <pthread.h>
#include <queue>
#include <vector>
#include "Log.hpp"
#include "Cond.hpp"
#include "Mutex.hpp"
#include "Thread.hpp"
using namespace std;
using namespace my_log;
using namespace my_cond;
using namespace my_mutex;
using namespace my_thread;
#define NUM 5
namespace my_threadpool
{
    template <typename T>
    class ThreadPool
    {
    public:
        ThreadPool(int num = NUM);
        void Run();
        void Stop();
        bool Push(const T &task);
        void Join();
    private:
        int _num;
        Mutex _lock;
        Cond _cond;
        queue<T> _taskq;
        vector<thread<T>> _threads;
        int _sleepnum;
        bool _isrunning;
    };
}

